Computer networks are becoming increasingly complex, often involving low level as well as high level configurations at various layers of the network. For example, computer networks generally include numerous access policies, forwarding policies, routing policies, security policies, quality-of-service (QoS) policies, etc., which together define the overall behavior and operation of the network. Network operators have a wide array of configuration options for tailoring the network to the needs of the users. While the different configuration options available provide network operators a great degree of flexibility and control over the network, they also add to the complexity of the network. In many cases, the configuration process can become highly complex. Not surprisingly, the network configuration process is increasingly error prone. In addition, troubleshooting errors in a highly complex network can be extremely difficult. The process of identifying the root cause of undesired behavior in the network can be a daunting task.